 1.Kafka高级特性解析之分区中自动再均衡
   
   我们可以在新建主题的时候，手动指定主题各个Leader分区以及Follower分区的分配情况，即什么分区副本在哪
个broker节点上。
   随着系统的运行,broker的宕机重启，会引发Leader分区和Follower分区的角色转换，最后可能Leader大部分都
集中在少数几台broker上，由于Leader负责客户端的读写操作，此时集中Leader分区的少数几台服务器的网络I/O，
CPU，以及内存都会很紧张。
   Leader和Follower的角色转换会引起Leader副本在集群中分布的不均衡，此时我们需要一种手段，让Leader的分
布重新恢复到一个均衡的状态。
   执行脚本：
   [root@linux121 ~]# kafka-topics.sh --zookeeper linux121:2181/myKafka --create --topic
tp_demo_03 --replica-assignment "0:1,1:0,0:1"
   上述脚本执行的结果是：创建了主题tp_demo_03，有三个分区，每个分区两个副本，Leader副本在列表中第⼀
个指定的brokerId上，Follower副本在随后指定的brokerId上。
   然后模拟broker0宕机的情况：
   # 通过jps找到Kafka进程PID
[root@linux121 ~]# jps
54912 Jps
1699 QuorumPeerMain
1965 Kafka
# 直接杀死进程
[root@linux121 ~]# kill -9 1965
[root@linux121 ~]# jps
1699 QuorumPeerMain
54936 Jps
[root@linux121 ~]#
# 查看主题分区信息：
[root@linux121 ~]# kafka-topics.sh --zookeeper linux121:2181/myKafka --describe --topic
tp_demo_03
Topic:tp_demo_03 PartitionCount:3 ReplicationFactor:2 Configs:
   Topic: tp_demo_03 Partition: 0 Leader: 1 Replicas: 0,1 Isr: 1
   Topic: tp_demo_03 Partition: 1 Leader: 1 Replicas: 1,0 Isr: 1
   Topic: tp_demo_03 Partition: 2 Leader: 1 Replicas: 0,1 Isr: 1
   [root@linux121 ~]#
# 重新启动linux121上的Kafka
   [root@linux121 ~]# kafka-server-start.sh -daemon /opt/kafka_2.12-1.0.2/config/server.properties
   [root@linux121 ~]# jps
1699 QuorumPeerMain
55525 Kafka
55557 Jps
   [root@linux121 ~]#
# 查看主题的分区信息：
  [root@linux121 ~]# kafka-topics.sh --zookeeper linux121:2181/myKafka --describe --topic
tp_demo_03
Topic:tp_demo_03 PartitionCount:3 ReplicationFactor:2 Configs:
   Topic: tp_demo_03 Partition: 0 Leader: 1 Replicas: 0,1 Isr: 1,0
   Topic: tp_demo_03 Partition: 1 Leader: 1 Replicas: 1,0 Isr: 1,0
   Topic: tp_demo_03 Partition: 2 Leader: 1 Replicas: 0,1 Isr: 1,0
  [root@linux121 ~]#
# broker恢复了，但是Leader的分配并没有变化，还是处于Leader切换后的分配情况。
  是否有一种方式，可以让Kafka自动帮我们进行修改？改为初始的副本分配？
  此时，用到了Kafka提供的自动再均衡脚本： kafka-preferred-replica-election.sh 
  先看介绍：
  该工具会让每个分区的Leader副本分配在合适的位置，让Leader分区和Follower分区在服务器之间均衡分配。
  如果该脚本仅指定zookeeper地址，则会对集群中所有的主题进行操作，⾃动再平衡。
  具体操作
  1).创建preferred-replica.json，内容如下：
{
   "partitions": [
     {
      "topic":"tp_demo_03",
      "partition":0
     },
     {
      "topic":"tp_demo_03",
      "partition":1
     },
     {
      "topic":"tp_demo_03",
      "partition":2
     }
  ]
}
  2).执行操作：
  [root@linux121 ~]# kafka-preferred-replica-election.sh --zookeeper
linux121:2181/myKafka --path-to-json-file preferred-replicas.json
Created preferred replica election path with {"version":1,"partitions":
[{"topic":"tp_demo_03","partition":0},{"topic":"tp_demo_03","partition":1},
{"topic":"tp_demo_03","partition":2}]}
Successfully started preferred replica election for partitions Set(tp_demo_03-
0, tp_demo_03-1, tp_demo_03-2)
[root@linux121 ~]#
  3).查看操作的结果：
  [root@linux121 ~]# kafka-topics.sh --zookeeper linux121:2181/myKafka --describe --topic tp_demo_03
Topic:tp_demo_03	PartitionCount:3	ReplicationFactor:2	Configs:
	Topic: tp_demo_03	Partition: 0	Leader: 0	Replicas: 0,1	Isr: 0,1
	Topic: tp_demo_03	Partition: 1	Leader: 1	Replicas: 1,0	Isr: 0,1
	Topic: tp_demo_03	Partition: 2	Leader: 0	Replicas: 0,1	Isr: 0,1
  [root@linux121 ~]# 
  恢复到最初的分配情况。
  之所以是这样的分配，是因为我们在创建主题的时候：
  --replica-assignment "0:1,1:0,0:1" 
  在逗号分割的每个数值对中排在前面的是Leader分区，后面的是副本分区。那么所谓的preferred replica，就是
排在前面的数字就是Leader副本应该在的brokerId。
   